package com.tedu.api;

import org.junit.Test;

import java.util.Locale;
import java.util.Scanner;

/**
 * JavaSE：基础语法、JavaOOP面向对象编程、JavaAPI（帮助文档，理解：字典）
 *
 * Java【内置】提供大量类、接口、抽象类、异常、错误
 * 【预计提供好的类库：8000，JavaAPI只学重点】
 *
 *JavaAPI：字符串、包装类、集合【泛型】、线程、多线程【并发--大数据】、IO流、Socket套接字【网络编程】
 *
 * jdk1.8.chm帮助文档   理解：新华字典  会查类、接口、抽象..使用
 *
 * JDK版本---帮助文档   根据用什么版本JDK，查对应版本帮助文档
 *
 * 必须会查API   String类---什么包下？
 *               java.lang【默认：不需要导入包】
 *
 * JDK1.8
 */
public class StringAPI {
    /**
     * JDK1.8 StringAPI类库：构造器怎么用，方法怎么用？
     * 包位置：Java.lang 【不需要导入包：System、string】
     * 特点：不需要导入包、不可以被继承、字符数组、定义完毕对对象无法修改，可以覆盖，
     * String类是final、Java字符串编码集
     * 顶级UniCod：GBK、UTF-8：任何字符对应2个字节
     * 字符串底层：封装了字符数组及针对字符数组的操作算法
     * 字符数组===字符串
     * 定义：String str="直接量";  给定值直接创建
     *
     * java: 错误: 无效的源发行版：17
     * maven项目：自动下载：junit版本--testng级别【识别JDK17】
     * 调整maven项目jdk版本：17版本降到1.8版本
     *
     */
@Test
public void testString(){
    String str="字符串";
    System.out.println(str);
    char[] c={'字','符','串'}; //字符数组
    System.out.println(c);
    //字符串创建出来，无法修改，因为String是final修饰
    String s="hello world";
    s="123";  //对对象进行覆盖
    System.out.println(s);
}
/**
 * 定义给定值方式：String str="java123"
 * Java为了提高性能，针对静态字符串(字面量/常量/链接后结果)
 * 创建在String常量池中，对于重复创建静态字符串，JVM虚拟机首先会在常量池中寻找，如果找到就返回对象，
 * 找不到继续创建对象！
 *
 * String常量池
 * JVM会在虚拟机的堆内存中开辟一块空间，保存曾经使用过的字面量|常量
 * 一旦后期又使用相同的字面量|常量，不会创建新对象，直接使用老对象
 * 好处：减少内存开销，提高性能
 *
 *
 */
@Test
public void testStrings(){
    String s1="java123";//公共常量池
    String s2="java123";//不会创建对象，从常量池Java123
    System.out.println(s1==s2); //true
    String s="java123";//s对象  不可修改
    String s3=s+"123";//s3对象=s对象+"123"  s3新对象
    System.out.println(s1==s3);//Java123 == Java123  false
    String s4="java"+"123";
    //右侧：直接量方式拼接，静态字符串，存入常量池中
    System.out.println(s2==s4); //true
    //s2的java123是从常量池中获取，s4拼接后静态字符串，从常量池中获取
    //------------------上面是给定值定义字符串方式：拥有常量池--------------------------
    //------------------下面的代码：创建字符串对象方式:创建一个新对象--------------------------
    String s5=new String("java123");//false
    //new出来的对象，一定是新对象，不存在于常量池
    System.out.println(s4==s5);

}
/**
 * String API 方法
 * length方法  返回值：int
 * 作用：返回当前字符串的长度（个数）---借鉴于数组
 *特点：字符串包含：特殊字符空格、字母、汉字
 *      String对象采用Uincode顶级编码：每个字符算1个，占两个字节
 */
@Test
    public void testLength(){
    String str="Hello World";//11个 原因：空格也占两个字节
    System.out.println(str.length());
    str=" 我爱Java";
    System.out.println(str.length());//7
}
/**
 * indexOf方法 --- 重载功能：修饰符 返回值 方法名 一致
 *                                     参数不一致
 * indexOf(String index)  返回值：int
 * 第一个参数 String str：传入指定字符串
 *  * 第二个参数 int index：查找指定具体位置的下标
 *  * 作用：查找"具体下标位"的"字符串"在”当前字符串“中位置，首位值，
 * 如果匹配到对应字符，输出首位值下标，
 * 如果查找相同名称，向下一位查找，不包含当前位置
 * 如果没有匹配到对应字符，返回-1值
 * indexOf("String str,int index"); 返回值：int
 * lastIndexOf(String str)方法
 * 作用：找到匹配字符串中对应最后出现子字符串的位置
 */
@Test
public void testIndexOf(){
    String str="thinking in java";//java编程思想【第四版】
    //返回值：下标位
    int index=str.indexOf("j");//从零开始数遇到的第一个j的位置  12  用处：查找第一位相同
    System.out.println("打印下标位"+index);
   index=str.indexOf("in",8);
   //作用：查找指定某一位相同  从第三个往后
    System.out.println("指定下标位"+index);//5
    //lastIndexOf()找到最后一次出现的下标位置
    index=str.lastIndexOf("in");
    System.out.println("最后的下标位："+index);//9
}
/**
 * StringAPI针对字符串提供三种方法：截取、替换、分割
 * subString方法      截取   返回值：String类型
 * subString(int start,int end)
 * 作用：截取字符串，从下标start位置开始截取，截取到end下标位置
 * subString(int index)
 * 作用：截取字符串，从下标index位置开始截取，截取到最后
 * 通用口诀：含头不含尾
 */
@Test
    public void testSubString(){
    String url="www.baidu.com";//需求：通过截取字符串baidu
    //url=url.substring(9,12);
    System.out.println("截取字符串："+url);
    //需求：通过截取字符串 .com
    url=url.substring(9);
    System.out.println("截取子字符串，截取到最后"+url);
}
/**
 * charAt方法   返回值char
 * 作用：返回当前字符串中指定位置的字符
 * StringIndexOutOfBoundsException  异常：下标越界
 * 出现原因：下标超出范围
 */
@Test
    public  void testCharAt(){
    String str="thinking in java";
    char c=str.charAt(15);
    System.out.println("获取到对应字符"+c);
}
/**
 * trim方法 返回值 String
 * 作用：去掉当前字符串前后空格【转大小写叠加使用】
 *
 * toLowerCase方法 返回值String
 * 作用：将字符串中所有字符转换为小写
 * toUpperCase方法 返回值String
 * 作用：将字符串中所有字符转换为大写
 * 验证码：xD4e   前台显示：xD4e  用户输入：xd4e
 */
@Test
    public void testTrim(){
    String str=" xD4e ";//后台出入前后都加空格，xD4e判断
    //后台传入前台字符串---一律空
    str=str.trim().toLowerCase();
    System.out.println("去掉空格："+str);
}
/**
 * 正则表达式：语法-元字符 ^[0-9]*$
 * 验证字符串
 * matches方法   返回值：boolean
 * 作用：用于验证字符串，使用正则表达式进行验证【过滤字符】
 *      返回值true正则验证成功，返回false正则验证失败
 */
public static void main(String[] args) {//主方法前面不能加@Test
    String regex="^\\d{15}|\\d{18}$";
    System.out.println("请输入");
    //从控制台输入【模拟用户输入】 123
    Scanner input=new Scanner(System.in);
    //判断，如果正则通过，返回是数字，反之相反
    if(input.nextLine().matches(regex)){//input.nextLine()从控制台输入字符串
        System.out.println("是身份证号");
    }else{
        System.out.println("不是地球人");
    }
}
/**
 * replace方法   替换   返回值：String
 * replace(String a,String b)
 * 第一个参数 String a 传入替换字符
 * 第二个参数 String b 传入查找字符
 * 用于匹配字符串中存在的字符，匹配成功，替换成新字符,不支持正则
 *
 * replaceAll(String regex,String b)
 * 用于全部匹配字符串中存在的字符，按照正则匹配成功，替换成新字符，支持正则
 */
@Test
    public void testReplace(){
    String str="我是神里绫华的狗";
    str=str.replace("神里绫华","流萤小姐");
    System.out.println("替换后的字符串："+str);

    String regex="^[\\u4e00-\\u9fa5]{0,}$";//验证汉字
    String say="我去年买了块表";
    say=say.replaceAll(regex,"宝了个贝的小可爱");
    System.out.println("替换后的字符："+say);
}
/**
 * split方法   分割   返回值：String[]
 * 作用：用于按照”正则“或者”字符串“的方式分割字符串
 * www.baidu.com  按照.的方式获取
 * 在split里写.代表正则表达式：.   .代表匹配一个字符
 * split写.  注意：转义成.  用\\.
 */
@Test
    public void testSplit(){
    String url="www.baidu.com";//不知道下标情况下，获取baidu
    String[] urls=url.split("\\.");
    System.out.println(urls[1]);//ArrayIndexOutOfBoundsException数组下标越界
    //打印字符串数组--增强for  数组数据类型 引用：遍历数组引用
    for(String s:urls){
        System.out.println("分割后的元素值："+s);
    }
}
/**
 * valueOf()   静态方法   返回值：String
 * 静态方法可以通过类名直接访问
 * 作用：基础数据类型转换为字符串
 */
@Test
    public void testValueOf(){
    int i=123;//基础数据类型转换为字符串
    String s= String.valueOf(i);
    if (s.equals("123")){  //s对象==”123“  判断对象 false   ==是直接判断对象是否完全相等
                           //s对象.equals("123") 判断值 true
        System.out.println("是字符串");
    }
    else{
        System.out.println("不是字符串");
    }
}
}


